// 由一个组件，向上找到最近的指定组件
function findComponentUpward(context, componentName) {
  let parent = context.$parent;
  let name = parent.$options.name
  // 规避root，name可有可无 name是否相等于componentName
  // name === componentName是打破true的
  // name === 'leftcomp'&&name  >   namp !== 'leftcomp' || !name
  while(parent && (!name || name !== componentName || [componentName].indexOf(name) < 0)){
    // 这里执行的是找不到name相等的  
    parent = parent.$parent
    
    if(parent) name = parent.$options.name
  } 
  return parent
}
// 由一个组件，向上找到所有的指定组件
// root > name && name === 'le'
function findComponentsUpwards (context, componentName) {
  // 自己的写法
  // let parent = context.$parent
  // let name = parent.$options.name
  // let arr = []
  // while(parent){
  //   if(name&&name === componentName){
  //     arr.push(parent)
  //   }
  //   parent = parent.$parent
  //   if(parent) name = parent.$options.name
  // }
  // return arr

  // 教程写法
  let parent = context.$parent
  let arr = []
  if(parent){
    if(parent.$options.name === componentName) arr.push(parent)
    return arr.concat(findComponentsUpwards(parent, componentName))
  }else{
    return []
  }
}
// 向下找到最近的指定组件
// name&&name===''
function findComponentDownward(context, componentName){
  // 要获取$children需要在mounted里获取，因为组件是内到外渲染的，父组件的created先于子组件的mounted，也就是子组件还没有被挂载到dom上，所以要在父组件上的mounted上
  // this is me function
  let childs = context.$children
  // 记录找到的child,有就直接跳出递归
  let children = null
  if(childs.length){
    for(let child of childs){
      if(child.$options.name === componentName){
        // return child
        children = child
        break;
      }else{
        children = findComponentDownward(child, componentName)
        if(children) break;
      }
    }
  }
  return children
  // 教程例子

  // const childrens = context.$children;
  // let children = null;

  // if (childrens.length) {
  //   for (const child of childrens) {
  //     const name = child.$options.name;

  //     if (name === componentName) {
  //       children = child;
  //       break;
  //     } else {
  //       children = findComponentDownward(child, componentName);
  //       if (children) break;
  //     }
  //   }
  // }
  // return children;
}
// 向下找到所有指定的组件
// name==='' name child
function findComponentsDownward(context, componentName){
  // this is me function
  // let childs = context.$children
  // let arr = []
  // if(childs.length){
  //   for(var child of childs){
  //     if(child.$options.name===componentName) arr.push(child)
  //     return arr.concat(findComponentsDownward(child, componentName))
  //   }
  // }
  // return arr
  // 教程function  当没有child时就跳出递归  当没有child时reduce不会执行循环中的代码跳出递归 所以最后一次返回一个空数组
  return context.$children.reduce((components, child) => {
    if (child.$options.name === componentName) components.push(child);
    const foundChilds = findComponentsDownward(child, componentName);
    return components.concat(foundChilds);
  }, []);
}
// 找到指定组件的兄弟组件  就是找到和自己同级的组件
// 通过父组件来找 
// eslint-disable-next-line no-unused-vars
function findBrothersComponents(context, componentName, exceptMe = true){
  let res = context.$parent.$children.filter(item => item.$options.name === componentName)
  // 下两步是去掉除开本身的组件   但本身的name要等于componentName
  // let index = res.findIndex(item => item._uid === context._uid);
  // if (exceptMe) res.splice(index, 1);
  return res
}

export { findComponentUpward, findComponentsUpwards, findComponentDownward, findComponentsDownward, findBrothersComponents }